package com.webauto.selenium;

import java.util.List;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import com.webauto.log.Log;
import com.webauto.test_case.BaseCase;

/**
 * PS:元素操作工具类
 * @author lkk
 *
 */
public class FindElementUtil {
	//超时等待时间
	private static final int TIMEOUTINSECONDS  = 8;
	
	/**
	 * PS:直接查找获取元素
	 * @param by 位置对象
	 * @return 元素对象
	 */
	public static WebElement findElement(final By by) {
		//最终返回的元素对象
		WebElement webElement = null;
		try {
			webElement = BaseCase.driver.findElement(by);
		}catch (Exception e) {
			Log.error("+++未查询到页面元素,位置信息:"+by+";+++");
		}
		return webElement;
	}
	/**
	 * PS:隐式等待查找获取元素
	 * @param by 位置对象
	 * @return 元素对象
	 */
	public static WebElement waitFindElement(final By by) {
		//最终返回的元素对象
		WebElement webElement = null;
		//隐式驱动等待对象
		WebDriverWait webDriverWait = new WebDriverWait(BaseCase.driver, TIMEOUTINSECONDS);
		try {
			//满足元素加载成功既获取到元素
			webElement = webDriverWait.until(ExpectedConditions.presenceOfElementLocated(by));
		}catch(Exception e) {
			Log.error("+++未查询到页面元素,位置信息:"+by+";+++");
		}
		return webElement;
	}
	
	/**
	 * PS:隐式等待查找获取元素
	 * @param by 位置对象
	 * @param timeOutInSeconds 超时时间
	 * @return 元素对象
	 */
	public static WebElement waitFindElement(final By by,long timeOutInSeconds) {
		//最终返回的元素对象
		WebElement webElement = null;
		//隐式驱动等待对象
		WebDriverWait webDriverWait = new WebDriverWait(BaseCase.driver, timeOutInSeconds);
		try {
			//满足元素加载成功既获取到元素
			webElement = webDriverWait.until(ExpectedConditions.presenceOfElementLocated(by));
		}catch(Exception e) {
			Log.error("+++未查询到页面元素,位置信息:"+by+";+++");
		}
		return webElement;
	}
	/**
	 * PS:等待页面完成再进行元素查找		
	 * @param by 位置对象
	 * @return 元素对象
	 */
	public static WebElement waitFindElementForPageLoad(final By by) {
		//最终返回的元素对象
		WebElement webElement = null;
		//检测页面是否加载完毕js语句
		String js = "return document.readyState == 'complete'";
		//隐式驱动等待对象
		WebDriverWait webDriverWait = new WebDriverWait(BaseCase.driver, TIMEOUTINSECONDS);
		//检测是否满足js语句条件
		boolean isReady = (boolean)webDriverWait.until(ExpectedConditions.jsReturnsValue(js));
		//满足条件则使用隐式等待查找元素
		if(isReady) {
			webElement = waitFindElement(by);
		}
		return webElement;
	}
	/**
	 * PS:等待页面完成再进行元素查找		
	 * @param by 位置对象
	 * @return 元素对象
	 */
	public static WebElement waitFindElementForPageLoad(final By by,long timeOutInSeconds) {
		//最终返回的元素对象
		WebElement webElement = null;
		//检测页面是否加载完毕js
		String js = "return document.readyState == 'complete'";
		//隐式驱动等待对象
		WebDriverWait webDriverWait = new WebDriverWait(BaseCase.driver, timeOutInSeconds);
		//检测是否满足js语句条件
		boolean isReady = (boolean)webDriverWait.until(ExpectedConditions.jsReturnsValue(js));
		//满足条件则使用隐式等待查找元素
		if(isReady) {
			webElement = waitFindElement(by,timeOutInSeconds);
		}
		return webElement;
	}
	
	/**
	 * PS:返回可点击元素对象
	 * @param by 位置对象
	 * @return 元素对象
	 */
	public static WebElement FindElementMeetClick(By by) {
		//最终返回的元素对象
		WebElement webElement = null;
		//隐式驱动等待对象
		WebDriverWait webDriverWait = new WebDriverWait(BaseCase.driver, TIMEOUTINSECONDS);
		try {
			//元素可点击则返回元素对象
			webElement = webDriverWait.until(ExpectedConditions.elementToBeClickable(by));
		}catch(Exception e) {
			Log.error("+++未获取到可点击元素,位置信息:"+by+";+++");
		}
		return webElement;
		
	}
	
	/**
	 * PS:返回可点击元素对象
	 * @param by 位置对象
	 * @param timeOutInSeconds 等待时间
	 * @return 元素对象
	 */
	public static WebElement FindElementMeetClick(By by,long timeOutInSeconds) {
		//最终返回的元素对象
		WebElement webElement = null;
		//隐式驱动等待对象
		WebDriverWait webDriverWait = new WebDriverWait(BaseCase.driver, timeOutInSeconds);
		try {
			//元素可点击则返回元素对象
			webElement = webDriverWait.until(ExpectedConditions.elementToBeClickable(by));
		}catch(Exception e) {
			Log.error("+++未获取到可点击元素,位置信息:"+by+";+++");
		}
		return webElement;
	}
	
	
	/**
	 * PS:多元素查询
	 * @param by 元素路径
	 * @return 元素集合对象
	 */
	public static List<WebElement> findElements(final By by){
		List<WebElement> list = null;
		try {
			list = new WebDriverWait(BaseCase.driver,TIMEOUTINSECONDS).until(new ExpectedCondition<List<WebElement>>() {
				public List<WebElement> apply(WebDriver driver){
					return driver.findElements(by);
				}
			});
		} catch (Exception e) {
			Log.error("+++未查询到页面元素,位置信息:"+by+";+++");
		}
		return list;
	}
	
	/**
	 * PS:多元素查询
	 * @param by 元素路径
	 * @param timeOutInSeconds 超时时间
	 * @return 元素集合对象
	 */
	public static List<WebElement> findElements(final By by,long timeOutInSeconds){
		List<WebElement> list = null;
		try {
			list = new WebDriverWait(BaseCase.driver,timeOutInSeconds).until(new ExpectedCondition<List<WebElement>>() {
				public List<WebElement> apply(WebDriver driver){
					return driver.findElements(by);
				}
			});
		} catch (Exception e) {
			Log.error("+++未查询到页面元素,位置信息:"+by+";+++");
		}
		return list;
	}
}
